<!doctype html>
<html lang="zh-cn">
  <head>
    <title>Redis(1) // JW Blog</title>
    <meta charset="utf-8" />
    <meta name="generator" content="Hugo 0.60.1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="John Doe" />
    <meta name="description" content="" />
    <link rel="stylesheet" href="https://duyi111.gitee.io/css/main.min.f90f5edd436ec7b74ad05479a05705770306911f721193e7845948fb07fe1335.css" />

    
    <meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Redis(1)"/>
<meta name="twitter:description" content="1.Redis的介绍 1.1 nosql介绍  泛指非关系型数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是KV形式 nosql的世界中没有一种通用的语言，每种nosql数据库都有自己的API和语法以及擅长的业务场景 nosql中的产品种类相当多  Redis MongoDB Hbase hadoop Cassandra hadoop    1.2 nosql和SQL数据库的比较  适用场景不同：SQL数据库适合于关系特别复杂的数据查询场景，nosql反之 事务特性的支持：SQL对事务的支持非常完善，而nosql基本不支持事务 两者在不断的取长补短，呈现融合趋势  1.3 Redis简介  Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。 Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色  1.4 Redis特性  Redis与其他key-value缓存产品有以下三个特点：  Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用 Redis不仅仅支持简单的key-value类型的数据，同时还提供list，set，zset，hash等数据结构的存储 Redis支持数据的备份，即master-slave模式的数据备份    1.5 Redis优势  性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。  1."/>

    <meta property="og:title" content="Redis(1)" />
<meta property="og:description" content="1.Redis的介绍 1.1 nosql介绍  泛指非关系型数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是KV形式 nosql的世界中没有一种通用的语言，每种nosql数据库都有自己的API和语法以及擅长的业务场景 nosql中的产品种类相当多  Redis MongoDB Hbase hadoop Cassandra hadoop    1.2 nosql和SQL数据库的比较  适用场景不同：SQL数据库适合于关系特别复杂的数据查询场景，nosql反之 事务特性的支持：SQL对事务的支持非常完善，而nosql基本不支持事务 两者在不断的取长补短，呈现融合趋势  1.3 Redis简介  Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。 Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色  1.4 Redis特性  Redis与其他key-value缓存产品有以下三个特点：  Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用 Redis不仅仅支持简单的key-value类型的数据，同时还提供list，set，zset，hash等数据结构的存储 Redis支持数据的备份，即master-slave模式的数据备份    1.5 Redis优势  性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。  1." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://duyi111.gitee.io/post/redis1/" />
<meta property="article:published_time" content="2020-02-12T17:03:54+08:00" />
<meta property="article:modified_time" content="2020-02-12T17:03:54+08:00" />


  </head>
  <body>
    <header class="app-header">
      <a href="https://duyi111.gitee.io/"><img class="app-header-avatar" src="/avatar.jpg" alt="John Doe" /></a>
      <h1>JW Blog</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vehicula turpis sit amet elit pretium.</p>
      <div class="app-header-social">
        
      </div>
    </header>
    <main class="app-container">
      
  <article class="post">
    <header class="post-header">
      <h1 class ="post-title">Redis(1)</h1>
      <div class="post-meta">
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
  <title>calendar</title>
  <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
          Feb 12, 2020
        </div>
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-clock">
  <title>clock</title>
  <circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
          3 min read
        </div></div>
    </header>
    <div class="post-content">
      <h2 id="1redis">1.Redis的介绍</h2>
<h4 id="11-nosql">1.1 nosql介绍</h4>
<ul>
<li>泛指非关系型数据库</li>
<li>不支持SQL语法</li>
<li>存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是KV形式</li>
<li>nosql的世界中没有一种通用的语言，每种nosql数据库都有自己的API和语法以及擅长的业务场景</li>
<li>nosql中的产品种类相当多
<ul>
<li>Redis</li>
<li>MongoDB</li>
<li>Hbase hadoop</li>
<li>Cassandra hadoop</li>
</ul>
</li>
</ul>
<h4 id="12-nosqlsql">1.2 nosql和SQL数据库的比较</h4>
<ul>
<li>适用场景不同：SQL数据库适合于关系特别复杂的数据查询场景，nosql反之</li>
<li><em><strong>事务</strong></em>特性的支持：SQL对事务的支持非常完善，而nosql基本不支持事务</li>
<li>两者在不断的取长补短，呈现融合趋势</li>
</ul>
<h4 id="13-redis">1.3 Redis简介</h4>
<ul>
<li>Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。</li>
<li>Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色</li>
</ul>
<h4 id="14-redis">1.4 Redis特性</h4>
<ul>
<li>Redis与其他key-value缓存产品有以下三个特点：
<ul>
<li>Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用</li>
<li>Redis不仅仅支持简单的key-value类型的数据，同时还提供list，set，zset，hash等数据结构的存储</li>
<li>Redis支持数据的备份，即master-slave模式的数据备份</li>
</ul>
</li>
</ul>
<h4 id="15-redis">1.5 Redis优势</h4>
<ul>
<li>性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。</li>
<li>丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。</li>
<li>原子 – Redis的所有操作都是原子性的。</li>
<li>丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。</li>
</ul>
<h4 id="16-redis">1.6 Redis应用场景</h4>
<ul>
<li>用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的（内存数据库）</li>
<li>可以在某些特定应用场景下替代传统数据库——比如社交类的应用</li>
<li>在一些大型系统中，巧妙地实现一些特定的功能：session共享、购物车</li>
<li>只要你有丰富的想象力，redis可以用在可以给你无限的惊喜…….</li>
</ul>
<h2 id="2redis">2.Redis的配置</h2>
<h4 id="21">2.1配置</h4>
<ul>
<li>Redis的配置信息在<code>/etc/redis/redis.conf</code>下</li>
<li>查看
<pre><code>sudo vi /etc/redis/redis.conf
</code></pre></li>
</ul>
<h4 id="22-">2.2 核心配置选项</h4>
<ul>
<li>绑定ip：如果需要远程访问，可将此行注释或绑定一个真实ip
<pre><code>bind 127.0.0.1
</code></pre></li>
<li>端口，默认是6379
<pre><code>port 6379
</code></pre></li>
<li>是否以守护进程运行
<ul>
<li>如果以守护进程运行，这不会在命令行阻塞，类似于服务</li>
<li>如果以非守护进程运行，则当前终端被阻塞</li>
<li>设置为yes表示守护进程，设置为no表示非守护进程</li>
<li>推荐设置为yes
<pre><code>daemonize yes
</code></pre></li>
</ul>
</li>
<li>数据文件
<pre><code>dbfilename dump.rdb
</code></pre></li>
<li>数据文件存储路径
<pre><code>dir /var/lib/redis
</code></pre></li>
<li>日志文件
<pre><code>logfile &quot;/var/log/redis/redis-server.log&quot;
</code></pre></li>
<li>数据库，默认有16个
<pre><code>database 16
</code></pre></li>
<li>主从复制，类似于双机备份
<pre><code>slaveof
</code></pre></li>
</ul>
<h2 id="3">3.服务端和客户端命令</h2>
<h4 id="31-">3.1 服务器端</h4>
<ul>
<li>服务器端的命令为<code>redis-server</code></li>
<li>可以使用help查看帮助文档
<pre><code>redis-server --help
</code></pre></li>
<li>其他
<ul>
<li><code>ps aux | grep redis</code> 查看redis服务器进程</li>
<li><code>sudo kill -9 pid</code> 杀死redis服务器</li>
<li><code>sudo redis-server /etc/redis/redis.conf</code> 指定加载的配置文件</li>
</ul>
</li>
</ul>
<h4 id="32-">3.2 客户端</h4>
<ul>
<li>客户端的命令为<code>redis-cli</code></li>
<li>可以使用help查看帮助文档
<pre><code>redis-cli --help
</code></pre></li>
<li>连接redis
<pre><code>redis-cli
</code></pre></li>
<li>运行测试命令
<pre><code>ping
</code></pre></li>
<li>切换数据库
<ul>
<li>数据库没有名称，默认有16个，通过0-15来标识，连接redis默认选择第一个数据库</li>
</ul>
<pre><code>select 10
</code></pre></li>
</ul>
<h2 id="4">4.数据操作</h2>
<h4 id="41-">4.1 数据结构</h4>
<ul>
<li>redis是key-value的数据结构，每条数据都是一个键值对</li>
<li>键的类型是字符串，注意：键不能重复</li>
<li>值的类型分为5种：
<ul>
<li>字符串string</li>
<li>哈希hash</li>
<li>列表list</li>
<li>集合set</li>
<li>有序集合zset</li>
</ul>
</li>
<li>数据操作行为：
<ul>
<li>保存</li>
<li>修改</li>
<li>获取</li>
<li>删除</li>
</ul>
</li>
</ul>
<h4 id="42-string">4.2 string类型</h4>
<ul>
<li>字符串类型是Redis中最为基础的数据存储类型，该类型可以接受任何格式的数据。在Redis中字符串类型的value最多可以容纳的数据长度是512M</li>
</ul>
<h6 id="421-">4.2.1 保存</h6>
<ul>
<li>如果设置的键不存在则为添加，如果设置的键已经存在则修改</li>
<li>设置键值
<pre><code>set key value
  
# 例：设置键为name值为aa的数据
set name aa
</code></pre></li>
<li>设置键值及过期时间，以秒为单位
<pre><code>setex key seconds value
  
# 例：设置键为aa值为bb过期时间为3秒的数据
setex aa 3 bb
</code></pre></li>
<li>设置多个键值
<pre><code>mset key1 value1 key2 value2 ...
  
# 例：设置键为a1值为python，键为a2值为java，键为a3值为c
mset a1 python a2 java a3 c
</code></pre></li>
<li>追加值
<pre><code>append key value
  
# 例：向键为a1中追加值haha
append a1 haha
</code></pre></li>
</ul>
<h6 id="422-">4.2.2 获取</h6>
<ul>
<li>获取：根据键获取值，如果不存在此键则返回nil
<pre><code>get key
  
# 例：获取键name的值
get name
</code></pre></li>
<li>根据多个键获取多个值
<pre><code>mget key1 key2 ...
  
# 例：获取a1，a2，a3的值
mget a1 a2 a3
</code></pre></li>
</ul>
<h4 id="43-">4.3 键命令</h4>
<ul>
<li>查找键，参数支持正则表达式
<pre><code>keys pattern
  
# 例1：查看所有键
keys *
  
# 例2：查看名称中包含a的键
keys a*
</code></pre></li>
<li>判断键是否存在，如果存在返回1，不存在返回0
<pre><code>exists key
  
# 例：判断键a1是否存在
exists a1
</code></pre></li>
<li>查看键对应的<code>value</code>的类型
<pre><code>type key
  
# 例：查看键a1的值类型，为redis支持的五种类型中的一种、
type a1
</code></pre></li>
<li>删除键及对应的值
<pre><code>del key1 key2 ...
  
# 例：删除键a2，a3
del a2 a3
</code></pre></li>
<li>设置过期时间，以秒为单位，如果没有指定过期时间则一直存在，直到使用<code>del</code>移除
<pre><code>expire key seconds
  
# 例：设置键a1的过期时间为3秒
expire a1 3
</code></pre></li>
<li>查看有效时间，以秒为单位
<pre><code>ttl key
  
# 例：查看键a1的有效时间
ttl a1
</code></pre></li>
</ul>
<h4 id="44-hash">4.4 hash类型</h4>
<ul>
<li><code>hash</code>用于存储对象，对象的结构为属性、值</li>
<li>值的类型为<code>string</code></li>
</ul>
<h6 id="441-">4.4.1 增加、修改</h6>
<ul>
<li>设置单个属性
<pre><code># 例：设置user的属性name为haha
hset user name haha
</code></pre></li>
<li>设置多个属性
<pre><code>例：设置键u2的属性name为lala，属性age为18
hmset u2 name lala age 18
</code></pre></li>
</ul>
<h6 id="442-">4.4.2 获取</h6>
<ul>
<li>获取指定键所有的属性
<pre><code>hkeys key
  
# 例：获取键u2的所有属性
hkeys u2
</code></pre></li>
<li>获取一个属性的值
<pre><code>hget key field
  
# 例：获取键u2属性name的值
hget u2 name
</code></pre></li>
<li>获取多个属性的值
<pre><code>hget key field1 field2 ...
  
# 例：获取键u2属性name，age的值
hget u2 name age
</code></pre></li>
<li>获取所有属性的值
<pre><code>hvals key
  
# 例：获取键u2所有属性的值
hvals u2
</code></pre></li>
</ul>
<h4 id="443-">4.4.3 删除</h4>
<ul>
<li>删除整个<code>hash</code>键及值，使用<code>del</code>命令</li>
<li>删除属性，属性对应的值会被一起删除
<pre><code>hdel key field1 field2 ...
  
# 例：删除键u2的属性age
hdel u2 age
</code></pre></li>
</ul>
<h4 id="45-list">4.5 list类型</h4>
<ul>
<li>列表的元素类型为<code>string</code></li>
<li>按照插入顺序排序</li>
</ul>
<h6 id="451-">4.5.1 增加</h6>
<ul>
<li>在左侧插入数据
<pre><code>lpush key value1 value2 ...
  
# 例：从键为a1的列表左侧加入数据a，b，c
lpush a1 a b c
</code></pre></li>
<li>在右侧插入数据
<pre><code>rpush key value1 value2 ...
  
# 例：从键为a1的列表右侧加入数据0,1
rpush a1 0 1
</code></pre></li>
<li>在指定元素的前或后插入新元素
<pre><code>linsert key before或after 现有元素 新元素
  
# 例：在键为a1的列表中元素b前加入3
linsert a1 before b 3
</code></pre></li>
</ul>
<h6 id="452-">4.5.2 获取</h6>
<ul>
<li>返回列表里指定范围内的元素
<ul>
<li><code>start</code>、<code>stop</code>为元素的下标索引</li>
<li>索引从左侧开始，第一个元素为0</li>
<li>索引可以是负数，表示从尾部开始计数，如-1表示最后一个元素</li>
</ul>
<pre><code>lrange key start stop
  
# 例：获取键为a1的列表所有元素
lrange a1 0 -1
</code></pre></li>
</ul>
<h6 id="453-">4.5.3 设置指定索引位置的元素值</h6>
<ul>
<li>索引从左侧开始，第一个元素为0</li>
<li>索引可以是负数，表示尾部开始计数，如-1表示最后一个元素
<pre><code>lset key index value
  
# 例：修改键为a1的列表中下标为1的元素值为z
lset a1 1 z
</code></pre></li>
</ul>
<h6 id="454-">4.5.4 删除</h6>
<ul>
<li>删除指定元素
<ul>
<li>将列表中前<code>count</code>次出现的值为value的元素移除</li>
<li><code>count &gt; 0</code>：从头往尾移除</li>
<li><code>count &lt; 0</code>：从尾往头移除</li>
<li><code>count = 0</code>：移除所有
<pre><code>lrem key count value
    
# 例：向列表a2中加入元素a、b、a、b、a、b，从a2列表右侧开始删除2个b
lpush a2 a b a b a b
lrem a2 -2 b
</code></pre></li>
</ul>
</li>
</ul>
<h4 id="46-set">4.6 set类型</h4>
<h6 id="461-">4.6.1 增加</h6>
<ul>
<li>添加元素
<pre><code>sadd key member1 member2 ...
  
# 例：向键a3的集合中添加元素zhangsan、lisi、wangwu
sadd a3 zhangsan lisi wangwu
</code></pre></li>
</ul>
<h6 id="462-">4.6.2 获取</h6>
<ul>
<li>返回所有的元素
<pre><code>smembers key 
  
# 例：获取键a3的集合中所有元素
smembers a3
</code></pre></li>
</ul>
<h6 id="463-">4.6.3 删除</h6>
<ul>
<li>删除指定元素
<pre><code>srem key
  
# 例：删除键a3的集合中元素wangwu
srem a3 wangwu
</code></pre></li>
</ul>
<h4 id="47-zset">4.7 zset类型</h4>
<ul>
<li>sorted set，有序集合</li>
<li>元素为string类型</li>
<li>元素具有唯一性，不重复</li>
<li>每个元素都会关联一个double类型的score，表示权重，通过权重将元素从小到大排序</li>
<li>说明：没有修改操作</li>
</ul>
<h6 id="471-">4.7.1 增加</h6>
<ul>
<li>添加
<pre><code>zadd key score1 member1 score2 member2 ...
  
# 例：向键a4的集合中添加元素lisi、wangwu、zhaoliu、zhangsan，权重分别是4、5、6、3
zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
  
</code></pre></li>
</ul>
<h6 id="472-">4.7.2 获取</h6>
<ul>
<li>返回指定范围内的元素</li>
<li>start、stop为元素的下标索引</li>
<li>索引从左侧开始，第一个元素为0</li>
<li>索引可以是负数，表示从尾部开始计数，如-1表示最后一个元素
<pre><code>zrange key start stop
  
# 例：获取键a4的集合中所有元素
zrange a4 0 -1
  
</code></pre></li>
<li>返回score值在min和max之间的 成员
<pre><code>zrangebyscore key min max
  
# 例：获取键a4的集合中权限值在5和6中的成员
zrangebyscore a4 5 6
</code></pre></li>
<li>返回成员member的score值
<pre><code>zscore key member
  
# 例：获取键a4的集合中元素zhangsan的权重
zsore a4 zhangsan
</code></pre></li>
</ul>
<h6 id="473-">4.7.3 删除</h6>
<ul>
<li>删除指定元素
<pre><code>zrem key member1 member2 ...
  
# 例：删除集合a4中元素zhangsan
zrem a4 zhangsan
</code></pre></li>
<li>删除权重在指定范围的元素
<pre><code>zremrangebyscore key min max
  
# 例：删除集合a4中权限在5、6之间的元素
zremrangebyscore a4 5 6
</code></pre></li>
</ul>

    </div>
    <div class="post-footer">
      
    </div>
  </article>

    </main>
  </body>
</html>
